using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace SpeedSearch
{

    /// <summary>
    /// Métodos úteis
    /// </summary>
    public static class Util
    {
        /// <summary>
        /// Texto que um texto deve conter para identificar uma versão
        /// </summary>
        static string VersionStr = ".v.";

        /// <summary>
        /// Retorna a versão de 1 path
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static string GetVersionName(string path, string versionStr = null)
        {
            versionStr = versionStr ?? VersionStr;
            string ret = null;
            if (!string.IsNullOrWhiteSpace(path) && path.Contains(versionStr))
            {
                int pos = path.IndexOf(versionStr);
                ret = versionStr;
                for (int i = pos + versionStr.Length; i < path.Length; i++)
                {
                    int num;
                    string _char = path[i].ToString();
                    if (_char == "." | Int32.TryParse(_char, out num))
                        ret += _char;
                }
                while (ret.StartsWith("."))
                    ret = ret.Substring(1, ret.Length - 1);
                while (ret.EndsWith("."))
                    ret = ret.Substring(0, ret.Length - 1);
            }
            return ret;
        }

        /*
        /// <summary>
        /// Retorna a date sem o milisegundos
        /// Usada pra comparação de datas de arquivos
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        public static DateTime ExtractMiliseconds(DateTime date)
        {
            return new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second);
        }

        /// <summary>
        /// Retorna a date sem o milisegundos
        /// Usada pra comparação de datas de arquivos
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        public static DateTime ExtractSeconds(DateTime date)
        {
            return new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, 0);
        }
        */

        /*
       public static string GetVersion(string path)
       {
           string ret = null;
           if (!string.IsNullOrWhiteSpace(path) && path.Contains(VersionStr))
           {
               string[] values = path.Split(new char[] { '\\'},  StringSplitOptions.RemoveEmptyEntries);
               foreach (var value in values)
               {

               }
               int pos = path.IndexOf(VersionStr);
               ret = 
               for (int i = pos + VersionStr.Length; i < path.Length; i++)
               {
                   int num;
                   if (Int32.TryParse(path[i].ToString(), out num))

               }
           }
           return ret;
       }
       */

        /// <summary>
        /// Checa se existe FileName. Se existir, deserializa o conteúdo do arquivo e retorna; senão, executa func, salva no arquivo, e retorna o resultado
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="fileName"></param>
        /// <param name="func"></param>
        /// <returns></returns>
        public static T Serialize<T>(string fileName, Func<T> func)
        {
            T value;
            var fmt = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            if (!File.Exists(fileName))
            {
                value = func();
                using (var w = new FileStream(fileName, FileMode.Create))
                    fmt.Serialize(w, value);
            }
            else
            {
                using (var w = new FileStream(fileName, FileMode.Open))
                    value = (T)fmt.Deserialize(w);
            }
            return value;
        }

        /// <summary>
        /// Idem a Serialize, porém só usa cache em "if DEBUG".
        /// Checa se existe FileName. Se existir, deserializa o conteúdo do arquivo e retorna; senão, executa func, salva no arquivo, e retorna o resultado
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="fileName"></param>
        /// <param name="func"></param>
        /// <returns></returns>
        public static T SerializeIfDebug<T>(string fileName, Func<T> func)
        {
#if DEBUG
            return Serialize<T>(fileName, func);
#else
            return func();
#endif
        }
    }

}
